package com.xtm.exercise.base.A12threadDemo.threadLocal;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * ThreadLocal
 */
public class ThreadLocalDemo {
    /**
     * ThreadLocal用于保存某个线程共享变量：对于同一个static ThreadLocal，不同线程只能从中get，set，remove自己的变量，而不会影响其他线程的变量。
     * 1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。
     * 2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。
     * 3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。
     *     PS:
     *          如果不删除。 Threadlocal中用完的信息，会有内存泄漏的风险
     *
     * 4、ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法，返回此方法值。
     */

    //线程变量隔离  用作:在每个线程，存储线程特定信息，可以使用threadlocal ， 解决线程安全问题
    public static ThreadLocal<List> threadLocal = new ThreadLocal<List>();
    public static ThreadLocal<Map<Object,Object>> threadLocalMap = new ThreadLocal<Map<Object,Object>>();
    public static ThreadLocal<Integer> threadLocalcount = new ThreadLocal<Integer>();

    private static void setTLocal(List value) {
        threadLocal.set(value);
    }
    private static List getTlocal() {
        return threadLocal.get();
    }
    private static void removeThreadLocal(){
        threadLocal.remove();
    }

    @Test
    public void test01(){
        List<String> list = new ArrayList<>();
        list.add("java");
        list.add("vue");
        list.add("css");
        //赋值
        this.setTLocal(list);
        //获取
        List tlocal = this.getTlocal();
        System.out.println(".................调用getTlocal，获取list值="+tlocal);

        //移除Threadlocal中用完的信息，否则会有内存泄漏的风险
        this.removeThreadLocal();
        //获取移除后的值
        List tlocalend = this.getTlocal();
        System.out.println(tlocalend);//null
    }
}
